// 个人中心页面逻辑 - 中医适宜技术防控青少年近视系统

const { isLoggedIn, getToken, logout, getUserProfile, computeUserStatus } = require('../../utils/auth.js');
const { buildMediaUrl } = require('../../utils/media');
const app = getApp();

Page({
  data: {
    // 用户信息
    userInfo: {
      avatarUrl: '', // 原始相对路径（数据库返回）
      nickName: '未登录用户',
      name: '',
      phone: '',
      studentInfo: null
    },

    displayAvatar: '', // 仅用于渲染的绝对 URL
    
    // 用户状态
    isLoggedIn: false,
    userStatus: 'visitor', // visitor | registered | complete
    
    // 页面状态
    loading: false,
    error: null
  },

  /**
   * 页面加载
   */
  onLoad() {
    console.log('个人中心页面加载');
    this.checkUserStatus();
    this.loadUserInfo();
  },

  /**
   * 页面显示
   */
  onShow() {
    // 强制刷新（登录后首次进入确保最新）
    this.checkUserStatus();
    this.loadUserInfo(true);
  },

  /**
   * 检查用户状态
   */
  checkUserStatus() {
    const { status, userInfo } = computeUserStatus();
  const rawAvatar = userInfo ? (userInfo.avatar || userInfo.avatar_url || userInfo.avatarUrl || '') : '';
    this.setData({
      isLoggedIn: status !== 'visitor',
      userStatus: status,
      userInfo: userInfo ? { ...this.data.userInfo, ...userInfo, studentInfo: userInfo.studentInfo || userInfo.student || null, avatarUrl: rawAvatar } : this.data.userInfo,
      displayAvatar: buildMediaUrl(rawAvatar)
    });
  },

  /**
   * 加载用户信息
   */
  async loadUserInfo(forceRefresh = false) {
    if (!this.data.isLoggedIn) {
      return;
    }

    try {
      this.setData({ loading: true, error: null });
      
  // 首先从服务器获取最新用户信息（若强制或本地状态不完整）
  if (forceRefresh || this.data.userStatus !== 'complete') {
  try {
    const serverUserInfo = await getUserProfile();
    // 归一化
    const normalized = serverUserInfo.studentInfo || serverUserInfo.student || null;
        const avatarRaw = serverUserInfo.avatar || serverUserInfo.avatar_url || serverUserInfo.avatarUrl || '';
        this.setData({ 
          userInfo: {
            ...this.data.userInfo,
            ...serverUserInfo,
            nickName: serverUserInfo.username || '用户',
            studentInfo: normalized,
            avatar: avatarRaw,
            avatarUrl: avatarRaw
          },
          displayAvatar: buildMediaUrl(avatarRaw)
        });
        
        // 更新用户状态
    const { status } = computeUserStatus(this.data.userInfo);
    this.setData({ userStatus: status });
        
      } catch (serverError) {
        console.log('从服务器获取用户信息失败，使用本地缓存:', serverError);
        
        // 如果服务器请求失败，则使用本地存储的信息
        const userInfo = wx.getStorageSync('userInfo');
        if (userInfo) {
          const localAvatar = userInfo.avatar || userInfo.avatar_url || userInfo.avatarUrl || '';
          this.setData({ 
            userInfo: {
              ...this.data.userInfo,
              ...userInfo,
              avatarUrl: localAvatar
            },
            displayAvatar: buildMediaUrl(localAvatar)
          });
          
          // 检查用户信息完整性
          const { status } = computeUserStatus(userInfo);
          this.setData({ userStatus: status });
        }
      }
  }
      
    } catch (error) {
      console.error('加载用户信息失败:', error);
      this.setData({ error: error.message });
    } finally {
      this.setData({ loading: false });
    }
  },

  /**
   * 更换头像
   */
  changeAvatar() {
    if (!this.data.isLoggedIn) {
      this.showLoginTip();
      return;
    }

    wx.chooseMedia({
      count: 1,
      mediaType: ['image'],
      sourceType: ['album', 'camera'],
      success: (res) => {
  const tempFilePath = res.tempFiles[0].tempFilePath;
  // 本地即时预览（wxfile:// 可直接显示）
  this.setData({ displayAvatar: tempFilePath });
  this.uploadAvatar(tempFilePath);
      },
      fail: (err) => {
        console.error('选择图片失败:', err);
      }
    });
  },

  /**
   * 上传头像
   */
  async uploadAvatar(filePath) {
    try {
      wx.showLoading({ title: '上传中...' });
      const token = getToken();
      if (!token) throw new Error('未登录');

      const uploadRes = await new Promise((resolve, reject) => {
        wx.uploadFile({
          url: `${app.globalData.apiBaseUrl}/upload/image?category=avatar`,
          filePath,
          name: 'image',
          formData: { category: 'avatar' },
          header: { 'Authorization': `Bearer ${token}` },
          success: resolve,
          fail: reject
        });
      });

      let relativeUrl = '';
      try {
        const data = JSON.parse(uploadRes.data || '{}');
        if (!data.success) throw new Error(data.message || '上传失败');
        relativeUrl = data.data && data.data.url ? data.data.url : '';
        if (!relativeUrl) throw new Error('上传响应缺少URL');
      } catch (e) {
        throw new Error(e.message || '上传响应解析失败');
      }

      // 将 avatar 写回用户资料（PUT 保存）
      await new Promise((resolve, reject) => {
        wx.request({
          url: `${app.globalData.apiBaseUrl}/user/profile`,
          method: 'PUT',
          header: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' },
          data: { avatar: relativeUrl },
          success: (r) => {
            if (r.statusCode === 200 && r.data && r.data.success) resolve(r); else reject(new Error(r.data && r.data.message || '资料保存失败'));
          },
          fail: reject
        });
      });

      // 更新本地缓存 & 状态（保持相对路径存储，display 使用 buildMediaUrl）
      const userInfo = { ...this.data.userInfo, avatar: relativeUrl, avatarUrl: relativeUrl };
      this.setData({ userInfo, displayAvatar: buildMediaUrl(relativeUrl) });
      const localCache = wx.getStorageSync('userInfo') || {};
      wx.setStorageSync('userInfo', { ...localCache, avatar: relativeUrl, avatarUrl: relativeUrl });

      wx.hideLoading();
      wx.showToast({ title: '头像更新成功', icon: 'success' });
    } catch (error) {
      wx.hideLoading();
      console.error('上传头像失败:', error);
      wx.showToast({ title: error.message || '上传失败', icon: 'error' });
      // 回退显示（如果之前已有头像）
      if (this.data.userInfo.avatarUrl) {
        this.setData({ displayAvatar: buildMediaUrl(this.data.userInfo.avatarUrl) });
      }
    }
  },

  /**
   * 导航到登录页面
   */
  navigateToLogin() {
    wx.navigateTo({
      url: '/pages/login/login',
      fail: (error) => {
        console.error('导航到登录页面失败:', error);
        wx.showToast({
          title: '页面跳转失败',
          icon: 'none'
        });
      }
    });
  },

  /**
   * 导航到个人信息设置
   */
  navigateToProfile() {
    wx.navigateTo({
      url: '/pages/settings/profile',
      fail: (error) => {
        console.error('导航到个人信息设置失败:', error);
        wx.showToast({
          title: '页面跳转失败',
          icon: 'none'
        });
      }
    });
  },

  /**
   * 导航到学生绑定
   */
  navigateToStudentBinding() {
    if (!this.data.isLoggedIn) {
      wx.showToast({
        title: '请先登录',
        icon: 'error'
      });
      return;
    }
    
    wx.navigateTo({
      url: '/pages/bind/bind',
      fail: () => {
        wx.showToast({
          title: '页面跳转失败',
          icon: 'error'
        });
      }
    });
  },

  /**
   * 导航到设置页面
   */
  navigateToSettings() {
    wx.navigateTo({
      url: '/pages/settings/index',
      fail: (error) => {
        console.error('导航到设置失败:', error);
        wx.showToast({
          title: '页面跳转失败',
          icon: 'none'
        });
      }
    });
  },

  /**
   * 导航到安全设置
   */
  navigateToSecurity() {
    wx.navigateTo({
      url: '/pages/settings/security',
      fail: (error) => {
        console.error('导航到安全设置失败:', error);
        wx.showToast({
          title: '页面跳转失败',
          icon: 'none'
        });
      }
    });
  },

  /**
   * 导航到我的记录
   */
  navigateToMyRecords() {
    wx.navigateTo({
      url: '/pages/records/index',
      fail: (error) => {
        console.error('导航到我的记录失败:', error);
        wx.showToast({
          title: '页面跳转失败',
          icon: 'none'
        });
      }
    });
  },

  /**
   * 导航到随访记录
   */
  navigateToFollowUp() {
    wx.navigateTo({
      url: '/pages/followup/index',
      fail: (error) => {
        console.error('导航到随访记录失败:', error);
        wx.showToast({
          title: '页面跳转失败',
          icon: 'none'
        });
      }
    });
  },

  /**
   * 导航到数据导出
   */
  navigateToDataExport() {
    wx.navigateTo({
      url: '/pages/export/index',
      fail: (error) => {
        console.error('导航到数据导出失败:', error);
        wx.showToast({
          title: '页面跳转失败',
          icon: 'none'
        });
      }
    });
  },

  /**
   * 导航到通知设置
   */
  navigateToNotifications() {
    wx.navigateTo({
      url: '/pages/notification/settings/settings'
    });
  },

  /**
   * 导航到隐私设置
   */
  navigateToPrivacy() {
    wx.navigateTo({
      url: '/pages/settings/privacy',
      fail: (error) => {
        console.error('导航到隐私设置失败:', error);
        wx.showToast({
          title: '页面跳转失败',
          icon: 'none'
        });
      }
    });
  },

  /**
   * 导航到关于我们
   */
  navigateToAbout() {
    wx.navigateTo({
      url: '/pages/about/index',
      fail: (error) => {
        console.error('导航到关于我们失败:', error);
        wx.showToast({
          title: '页面跳转失败',
          icon: 'none'
        });
      }
    });
  },

  /**
   * 导航到帮助中心
   */
  navigateToHelp() {
    wx.navigateTo({
      url: '/pages/help/index',
      fail: (error) => {
        console.error('导航到帮助中心失败:', error);
        wx.showToast({
          title: '页面跳转失败',
          icon: 'none'
        });
      }
    });
  },

  /**
   * 导航到意见反馈
   */
  navigateToFeedback() {
    wx.navigateTo({
      url: '/pages/feedback/index',
      fail: (error) => {
        console.error('导航到意见反馈失败:', error);
        wx.showToast({
          title: '页面跳转失败',
          icon: 'none'
        });
      }
    });
  },

  /**
   * 联系客服
   */
  contactService() {
    wx.showModal({
      title: '联系客服',
      content: '客服电话：400-123-4567\n工作时间：9:00-18:00',
      showCancel: true,
      cancelText: '取消',
      confirmText: '拨打',
      success: (res) => {
        if (res.confirm) {
          wx.makePhoneCall({
            phoneNumber: '4001234567',
            fail: () => {
              wx.showToast({
                title: '拨打失败',
                icon: 'error'
              });
            }
          });
        }
      }
    });
  },

  /**
   * 退出登录
   */
  async handleLogout() {
    wx.showModal({
      title: '确认退出',
      content: '确定要退出登录吗？',
      showCancel: true,
      cancelText: '取消',
      confirmText: '退出',
      success: async (res) => {
        if (res.confirm) {
          try {
            wx.showLoading({ title: '退出中...' });
            
            await logout();
            
            this.setData({
              isLoggedIn: false,
              userStatus: 'visitor',
              userInfo: {
                avatarUrl: '',
                nickName: '未登录用户',
                name: '',
                phone: '',
                studentInfo: null
              }
            });
            
            wx.hideLoading();
            wx.showToast({ title: '已退出登录', icon: 'success' });
            // 重启到首页
            setTimeout(() => {
              wx.reLaunch({ url: '/pages/welcome/welcome' });
            }, 500);
          } catch (error) {
            wx.hideLoading();
            console.error('退出登录失败:', error);
            wx.showToast({
              title: '退出失败',
              icon: 'error'
            });
          }
        }
      }
    });
  },

  /**
   * 显示登录提示
   */
  showLoginTip() {
    wx.showModal({
      title: '请先登录',
      content: '使用此功能需要先登录账号',
      showCancel: true,
      cancelText: '取消',
      confirmText: '去登录',
      success: (res) => {
        if (res.confirm) {
          this.navigateToLogin();
        }
      }
    });
  },

  /**
   * 分享功能
   */
  onShareAppMessage() {
    return {
      title: '中医适宜技术防控青少年近视系统',
      path: '/pages/welcome/welcome',
      imageUrl: '/images/share-cover.png'
    };
  },

  /**
   * 分享到朋友圈
   */
  onShareTimeline() {
    return {
      title: '中医适宜技术防控青少年近视系统',
      imageUrl: '/images/share-cover.png'
    };
  }
});